package com.hh.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hh.entity.UserAddr;
import com.hh.mapper.UserAddrMapper;
import com.hh.service.UserAddrService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 用户配送地址 服务实现类
 * </p>
 *
 * @author 辉辉
 * @since 2022-08-19
 */
@Service
@Slf4j
@CacheConfig(cacheNames = "com.hh.service.impl.UserAddrServiceImpl")
public class UserAddrServiceImpl extends ServiceImpl<UserAddrMapper, UserAddr> implements UserAddrService {

    @Resource
    private UserAddrMapper userAddrMapper;

    /**
     * 全查询用户收货地址
     *
     * @param openId
     * @return
     */
    @Override
    @Cacheable(key = "#openId")
    public List<UserAddr> findUserAddr(String openId) {
        List<UserAddr> userAddrs = userAddrMapper.selectList(Wrappers.<UserAddr>lambdaQuery()
                .eq(UserAddr::getUserId, openId)
                .eq(UserAddr::getStatus, 1)
        );
        return userAddrs;
    }

    @Override
    @CacheEvict(key = "#userAddr.userId")
    public boolean save(UserAddr userAddr) {
        log.info("新增用户收货地址");
        userAddr.setCreateTime(new Date());
        userAddr.setUpdateTime(new Date());
        userAddr.setStatus(1);
        userAddr.setStatus(1);
        userAddr.setVersion(0);
        // 业务 如果用户之前没有收货地址 那么新增的这一条就是默认的收货地址
        // 查询用户
        Integer count = userAddrMapper.selectCount(Wrappers.<UserAddr>lambdaQuery()
                .eq(UserAddr::getUserId, userAddr.getUserId())
                .eq(UserAddr::getCommonAddr, 1)
        );
        if (count <= 0) {
            // 说明之前就没有 那么就设置当前新增的是默认地址
            userAddr.setCommonAddr(1);
        }
        return userAddrMapper.insert(userAddr) > 0;
    }

    /**
     * 修改用户默认收货地址
     * 修改一个数据
     * 日志要怎么记录？
     * 记录的时候 要把之前的信息记录下来 把改后的信息记录下来 这样方便后期出了问题 做数据的回溯
     * 关键日志放在es里面 方便做数据的分析
     * 通过一个mq 八日至消息发送到logs-service 记录es
     * @param openId
     * @param id
     */
    @Override
    @Transactional(rollbackFor = RuntimeException.class)
    public void changeUserDefaultAddr(String openId, Long id) {
        // 查询到之前的默认地址
        UserAddr oldUserAddr = userAddrMapper.selectOne(Wrappers.<UserAddr>lambdaQuery()
                .eq(UserAddr::getUserId, openId)
                .eq(UserAddr::getCommonAddr, 1)
        );
        if (!ObjectUtils.isEmpty(oldUserAddr)) {
            // 把旧的收货地址 改一下
            oldUserAddr.setUpdateTime(new Date());
            oldUserAddr.setCommonAddr(0);
            // 插入进去
            userAddrMapper.updateById(oldUserAddr);
        }
        // 设置新的
        // 查询用户新的收货地址
        UserAddr newAddr = userAddrMapper.selectById(id);
        if (ObjectUtils.isEmpty(newAddr)) {
            log.error("新的默认地址的id不存在");
            throw new IllegalArgumentException("新的默认地址的id不存在");
        }
        newAddr.setCommonAddr(1);
        newAddr.setUpdateTime(new Date());
        userAddrMapper.updateById(newAddr);
    }
}
